/**
 * 
 */
package com.tomagency.cyberlab.server.config;

import java.math.BigDecimal;
import java.util.HashMap;

import org.apache.log4j.Logger;

import com.google.inject.Inject;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
import com.tomagency.cyberlab.server.exports.BubuConfig;
import com.tomagency.cyberlab.server.exports.BubuConfigImpl;
import com.tomagency.cyberlab.server.exports.FotoBuchSpec;
import com.tomagency.cyberlab.server.exports.FotoBuchSpecImpl;
import com.tomagency.cyberlab.server.imports.TaopixConfig;
import com.tomagency.cyberlab.server.imports.TaopixConfigImpl;
import com.tomagency.cyberlab.server.util.ServletHelper;

import de.gammadata.basics.modelle.LandDO;
import de.gammadata.business.modelle.AbholungDO;
import de.gammadata.business.modelle.BarzahlungDO;
import de.gammadata.business.modelle.NettoZahlungsBedingungDO;
import de.gammadata.business.modelle.PaymentServiceZahlungsArtDO;
import de.gammadata.business.modelle.ProduktDO;
import de.gammadata.business.modelle.VersandDO;
import de.gammadata.business.modelle.ZahlungsBedingung;
import de.gammadata.business.modelle.Produkt.Einheit;

/**
 * Stellt die Configuration für das Cyberlab-System zur Verfügung
 * Erzeugt Objekte mit Default-Werten falls nich als xml vorhanden
 * @author gfr
 *
 */
public class CyberlabConfigProviderImpl implements CyberlabConfigProvider {
	
	public static final String TAOPIX_CONFIG_FILE = "taopix.xml";
	public static final String TAOPIX_DEFAULT_FTP_SERVER="62.255.167.121";
	public static final String TAOPIX_USER="xml";
	public static final String TAOPIX_PW="vacr2+2T";
	public static final long TAOPIX_SCAN_INTERVALL = 5*60*1000L;
	public static final int TAOPIX_START_AUFTRAGSNUMMER=112500000;
	
	public static final String BUBU_CONFIG_FILE = "bubu.xml";
	public static final String BUBU_TEMPLATE_FILE = "bubu_template.xml";
	public static final String BUBU_DEFAULT_FTP_SERVER = "ftp-king.bubu.ch";
	public static final String BUBU_DEFAULT_USER = "ftp_cyberlab";
	public static final String BUBU_DEFAULT_PASSWORD = "12CyberLab34";
	public static final Long BUBU_ORDER_ID = 383000000000L;
	public static final Long BUBU_JOB_ID = 382000000000L;
	
	
	@Inject
	private FileSystemConfig filesystemConfig;

	private TaopixConfig taopixConfig=null;
	private BubuConfig bubuConfig=null;

	/**
	 * @see com.tomagency.cyberlab.server.config.CyberlabConfigProvider#getTaopixConfig()
	 */
	public TaopixConfig getTaopixConfig() {
		if (filesystemConfig==null){
			Logger.getLogger(this.getClass()).error("getTaopixConfig(): Fehler FileSystemConfig == null");
			return null;
		}
		if (taopixConfig==null){
			XStream xstream = new XStream(new DomDriver());
			String xml = ServletHelper.readXmlUFT8File(filesystemConfig.getConfigDirPath()+TAOPIX_CONFIG_FILE);
			if (xml!=null){
				taopixConfig = (TaopixConfig)xstream.fromXML(xml);
				Logger.getLogger(this.getClass()).info("getTaopixConfig() vom xml-File geladen: "+filesystemConfig.getConfigDirPath()+TAOPIX_CONFIG_FILE);
			}
			else{
				/*
				 * Taopix Objekt neu erzeugen und mit defaultwerten füllen
				 * und Abspeichern
				 */
				
				taopixConfig = genDefaultTaopixConfig();
				
				
				xml = xstream.toXML(taopixConfig);
				boolean ok=ServletHelper.saveXmlUTF8Body(filesystemConfig.getConfigDirPath()+TAOPIX_CONFIG_FILE, xml);
				if (ok)
					Logger.getLogger(this.getClass()).warn("getTaopixConfig(): TaopixConfig neu erzeugt und gespeichert Path= "+
						filesystemConfig.getConfigDirPath()+TAOPIX_CONFIG_FILE);
				else
					Logger.getLogger(this.getClass()).error("getTaopixConfig(): Fehler beim Speichern TaopixConfig Path= "+
							filesystemConfig.getConfigDirPath()+TAOPIX_CONFIG_FILE);
			}
		}
		return taopixConfig;
	}


	
	public BubuConfig getBubuConfig() {
		
		if (filesystemConfig==null){
			Logger.getLogger(this.getClass()).error("getBubuConfig(): Fehler FileSystemConfig == null");
			return null;
		}
		if (bubuConfig==null){
			XStream xstream = new XStream(new DomDriver());
			String xml = ServletHelper.readXmlUFT8File(filesystemConfig.getConfigDirPath()+BUBU_CONFIG_FILE);
			if (xml!=null){
				bubuConfig = (BubuConfig)xstream.fromXML(xml);
				
			}
			else{
				/*
				 * BubuConfig Objekt neu erzeugen und mit defaultwerten füllen
				 * und Abspeichern
				 */
				
				bubuConfig = genDefaultBubuConfig();
				
				
				xml = xstream.toXML(bubuConfig);
				boolean ok=ServletHelper.saveXmlUTF8Body(filesystemConfig.getConfigDirPath()+BUBU_CONFIG_FILE, xml);
				if (ok)
					Logger.getLogger(this.getClass()).warn("getBubuConfig(): BubuConfig neu erzeugt und gespeichert Path= "+
						filesystemConfig.getConfigDirPath()+BUBU_CONFIG_FILE);
				else
					Logger.getLogger(this.getClass()).error("getBubuConfig(): Fehler beim Speichern BubuConfig Path= "+
							filesystemConfig.getConfigDirPath()+BUBU_CONFIG_FILE);
			}
		}
		/*
		 * Die xml-template wird vom template File eingelesen
		 */
		String xmlTemplate = ServletHelper.readXmlUFT8File(filesystemConfig.getConfigDirPath()+BUBU_TEMPLATE_FILE);
		if (xmlTemplate!=null){
			bubuConfig.setXmlTemplate(xmlTemplate);
		}
		else{
			Logger.getLogger(this.getClass()).error("getBubuConfig(): Fehler beim Lesten Xml-template-File: "
					+filesystemConfig.getConfigDirPath()+BUBU_TEMPLATE_FILE);
		}

		return bubuConfig;
	}
	
	/**
	 * @see com.tomagency.cyberlab.server.config.CyberlabConfigProvider#
	 */
	public void setTaopixConfig(TaopixConfig taopixConfig) {
		this.taopixConfig=taopixConfig;

	}

	public void setBubuConfig(BubuConfig bubuConfig) {
		this.bubuConfig=bubuConfig;
		
	}
	
	public FileSystemConfig getFilesystemConfig() {
		return filesystemConfig;
	}

	public void setFilesystemConfig(FileSystemConfig filesystemConfig) {
		this.filesystemConfig = filesystemConfig;
	}
	
	private TaopixConfig genDefaultTaopixConfig(){
		TaopixConfig tc = new TaopixConfigImpl();
		
		tc.setStartAuftragsNummer(TAOPIX_START_AUFTRAGSNUMMER);
		
		FtpServerConfig ftpConfig = new FtpServerConfigImpl();
		ftpConfig.setFtpServerName(TAOPIX_DEFAULT_FTP_SERVER);
		ftpConfig.setFtpUserName(TAOPIX_USER);
		ftpConfig.setFtpPassword(TAOPIX_PW);
		tc.setFtpServerConfig(ftpConfig);		
		
		tc.setScanIntervall(TAOPIX_SCAN_INTERVALL); //Scanintervall in ms = 5min
		
		LandDO land = new LandDO();
		land.setName("AUSTRIA");
		land.setEigenNamen("Österreich");
		land.setIso3166_2_Code("AT");
		land.setIso3166_3_Code("AUT");
		land.setNummernCode(40);		
		tc.setStandardLand(land);

		tc.setTaopixAbholungBezeichnung("COLLECTION");
		tc.setTaopixBarzahlungsBezeichnung("COD");
		tc.setTaopixExpressVersandBezeichnung("EXPRESS");
		tc.setTaopixVersandBezeichnung("STANDARDPOST");
		tc.setTaopixPayPalzahlungsBezeichnung("PAYPAL");
		tc.setVersandKatalogName("Versand");
		
		tc.setStandardSteuerBezeichnung("Standard");
		tc.setStandardSteuerBetrag(new BigDecimal("20.00"));
		tc.setReduzierteSteuerBezeichnung("Reduziert");
		tc.setReduzierteBetrag(new BigDecimal("10.00"));
		
		AbholungDO artAbholung= new AbholungDO();
		artAbholung.setBezeichnung("abholung");
		artAbholung.setBeschreibung("Abholung");
		tc.setArtAbholung(artAbholung);
		
		VersandDO artVersand= new VersandDO();
		artVersand.setBezeichnung("versand");
		artVersand.setBeschreibung("Standardversand mit Paketdienst");
		artVersand.setLieferZeitInTagen(2);
		tc.setArtVersand(artVersand);
		
		VersandDO artExpress= new VersandDO();
		artExpress.setBezeichnung("express");
		artExpress.setBeschreibung("Expressversand mit Paketdienst");
		artExpress.setLieferZeitInTagen(1);
		tc.setArtExpressVersand(artExpress);
		
		BarzahlungDO bar = new BarzahlungDO();
		bar.setBezeichnung("bar");
		bar.setBeschreibung("Barzahlung");				
		tc.setBarzahlung(bar);
		
		PaymentServiceZahlungsArtDO paypal = new PaymentServiceZahlungsArtDO();
		paypal.setBezeichnung("paypal");
		paypal.setBeschreibung("Zahlung über PayPal");
		paypal.setZahlungsZielInTagen(ZahlungsBedingung.standardPaymentServiceZiel);
		tc.setPayPalzahlung(paypal);
		
		NettoZahlungsBedingungDO nettozahlung = new NettoZahlungsBedingungDO();
		nettozahlung.setBezeichnung("netto");
		nettozahlung.setBeschreibung("Zahlung rein netto in "+Integer.toString(ZahlungsBedingung.standardZahlungsZiel)+" Tagen");
		nettozahlung.setZahlungsZielInTagen(ZahlungsBedingung.standardZahlungsZiel);
		tc.setNettozahlung(nettozahlung);
		
		ProduktDO versandArtikel= new ProduktDO();
		versandArtikel.setArtikelCode("Versand-Std-Steuer");
		versandArtikel.setBezeichnung("Versand Standard Steuer");
		versandArtikel.setBeschreibung("Versandkosten zum standard Steuersatz");
		versandArtikel.setEinheit(Einheit.STK);
		tc.setVersandArtikel(versandArtikel);
		
		ProduktDO versandArtikelReduzierteSteuer= new ProduktDO();
		versandArtikelReduzierteSteuer.setArtikelCode("Versand-Reduzierte-Steuer");
		versandArtikelReduzierteSteuer.setBezeichnung("Versand Reduzierte Steuer");
		versandArtikelReduzierteSteuer.setBeschreibung("Versandkosten zum reduzierten Steuersatz");
		versandArtikelReduzierteSteuer.setEinheit(Einheit.STK);
		tc.setVersandArtikelReduzierteSteuer(versandArtikelReduzierteSteuer);
		
		
		return tc;
	}
	
	private BubuConfig genDefaultBubuConfig(){
		
		BubuConfig bc = new BubuConfigImpl();
		
		FtpServerConfig ftpConfig = new FtpServerConfigImpl();
		ftpConfig.setFtpServerName(BUBU_DEFAULT_FTP_SERVER);
		ftpConfig.setFtpUserName(BUBU_DEFAULT_USER);
		ftpConfig.setFtpPassword(BUBU_DEFAULT_PASSWORD);
		bc.setFtpServerConfig(ftpConfig);
		
		bc.setJobIdStartNummer(BUBU_JOB_ID);
		bc.setOrderIdStartNummer(BUBU_ORDER_ID);
		bc.setTest(true);
		
		bc.setProductList(genDefaultProductList());
		
		return bc;
	}
	
	private HashMap<String, FotoBuchSpec> genDefaultProductList(){
		HashMap<String, FotoBuchSpec> pl= new HashMap<String, FotoBuchSpec>();
		
		FotoBuchSpec fb_15x20 = new FotoBuchSpecImpl();
		fb_15x20.setFormatCode("HC.Slit.S.Q");
		fb_15x20.setProductCode("HC.Slit.S.Q");
		fb_15x20.setBezeichnung("Fotobuch 15x20 cm quer");
		fb_15x20.setBeschreibung("Fotobuch 15x20 cm quer");
		fb_15x20.setCoverPaperCode("Galaxi-Matt-150");
		fb_15x20.setContentPaperCode("Magno-Matt-170");
		fb_15x20.setCoverPaperCoating("glossy");
		pl.put("fb_15x20", fb_15x20);
		
		FotoBuchSpec fb_20x20 = new FotoBuchSpecImpl();
		fb_20x20.setFormatCode("HC.Slit.Q.H");
		fb_20x20.setProductCode("HC.Slit.Q.H");
		fb_20x20.setBezeichnung("Fotobuch 20x20 cm");
		fb_20x20.setBeschreibung("Fotobuch 20x20 cm");
		fb_20x20.setCoverPaperCode("Galaxi-Matt-150");
		fb_20x20.setContentPaperCode("Magno-Matt-170");
		fb_20x20.setCoverPaperCoating("glossy");
		pl.put("fb_20x20", fb_20x20);
		
		FotoBuchSpec fb_20x27_h = new FotoBuchSpecImpl();
		fb_20x27_h.setFormatCode("HC.Slit.C.H");
		fb_20x27_h.setProductCode("HC.Slit.C.H");
		fb_20x27_h.setBezeichnung("Fotobuch 20x27 cm hoch");
		fb_20x27_h.setBeschreibung("Fotobuch 20x27 cm hoch");
		fb_20x27_h.setCoverPaperCode("Galaxi-Matt-150");
		fb_20x27_h.setContentPaperCode("Magno-Matt-170");
		fb_20x27_h.setCoverPaperCoating("glossy");
		pl.put("fb_20x27_h", fb_20x27_h);
		
		FotoBuchSpec fb_20x30_q = new FotoBuchSpecImpl();
		fb_20x30_q.setFormatCode("HC.KB.A4.Q");
		fb_20x30_q.setProductCode("HC.KB.A4.Q");
		fb_20x30_q.setBezeichnung("Fotobuch A4 quer");
		fb_20x30_q.setBeschreibung("Fotobuch A4 quer");
		fb_20x30_q.setCoverPaperCode("CPS-190");
		fb_20x30_q.setContentPaperCode("Magno-Matt-170");
		fb_20x30_q.setCoverPaperCoating("glossy");
		pl.put("fb_20x30_q", fb_20x30_q);
		
		FotoBuchSpec fb_30x30 = new FotoBuchSpecImpl();
		fb_30x30.setFormatCode("HC.Slit.Maxi.H");
		fb_30x30.setProductCode("HC.Slit.Maxi.H");
		fb_30x30.setBezeichnung("Fotobuch 30x29,4 cm");
		fb_30x30.setBeschreibung("Fotobuch 30x29,4 cm");
		fb_30x30.setCoverPaperCode("CPS-190");
		fb_30x30.setContentPaperCode("Magno-Matt-200");
		fb_30x30.setCoverPaperCoating("glossy");
		pl.put("fb_30x30", fb_30x30);
		
		
		
		return pl;
	}

}

